"""
    开发者调试chrome浏览器，
    解决原生的程序执行出错会关闭浏览器从头再来
    需要给chrome浏览器加入--remote-debugging-port=9222参数运行，一定要提前运行，打开一个chrome窗口，
    然后修改core/autoService_config.py里面DEBUG为true，否则不会显示界面和
    使用工具包提供的getDriver获取驱动，每次执行到错误点，把前面可执行的代码注释掉，下次就不用再从头再来，
    再写代码解决当前错误点，多次这样调试，直到调试到理想的页面后，再把之前注释掉的代码解除注释，然后运行一遍，
    对于登录的网站，需要从头运行一遍的话，可以F12打开控制台清除localStorage（本地变量存储）和 cookie.

    此文件是解决某些不方便提取api的网站，进行UI交互发送验证码通过验证。
"""

import os
import sys

# 切换目录到上级目录，引入AutoService【正式情况下请把脚本放在上级目录，就可以不用这两句啦】
from selenium.webdriver.common.by import By

if not os.path.exists("core/autoService.py"):
    sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

from core.autoService import AutoService
from core.chromeDriver import getDriver
from selenium.webdriver.chrome.webdriver import WebDriver

driver = getDriver()  # type: WebDriver


class CrhomeDriverTest(AutoService):
    # 取消自动读取保存变量
    __autoLoadEnv__ = False

    def init(self, **kwargs):
        self.account = kwargs["account"]
        self.password = kwargs["password"]
        return super(CrhomeDriverTest, self).init(**kwargs)

    def login(self):
        driver.get("http://www.baidu.com")
        # 填写表单

        # 已下均为假设，请对应改为实际网页流程。

        # 假设填入账号
        driver.find_element(By.CSS_SELECTOR, "#kw").send_keys(self.account)
        # 假设填入账号
        driver.find_element(By.CSS_SELECTOR, "#kw").send_keys(self.password)
        # 假设点击了登录按钮
        driver.find_element(By.CSS_SELECTOR, "#btn").click()

        # 假设出现了验证码验证，页面有验证码发送按钮，
        self.sms_send()  # 在此处将有可能停一下，为了避免手机收验证码混淆。
        # 假设点击了发送验证码
        driver.find_element(By.CSS_SELECTOR, "#btn").click()
        # 假设获取了验证码
        code = self.getVerCode()
        # 假设填入验证码
        driver.find_element(By.CSS_SELECTOR, "#kw").send_keys(code)
        # 点击登录
        driver.find_element(By.CSS_SELECTOR, "#btn").click()

    def pick(self):
        """虚拟的一个执行签到的流程"""
        # 打开签到页面
        driver.get("http://www.baidu.com")
        # 点击签到按钮
        driver.find_element(By.CSS_SELECTOR, "#btn").click()

        # 此处做一个判断是否签到成功
        try:
            # 加入try是怕如果找不到这个元素，就会报错，所以我们用try容纳
            txt = driver.find_element(By.CSS_SELECTOR, "#text").text
            if txt == "签到成功":
                self.log("签到成功")
            else:
                self.log("签到失败，原因是", txt)
        except:
            self.log("签到失败，签到状态检测失败")
            file = self.getOutFileName("error.png")  # 文件命名格式请看源码
            driver.save_screenshot(file)  # 将报错了的错误保留在这个路径上，因为服务器那边是没有GUI界面的，只能通过保留截图的方法，把数据保留下来

    # 定义一个签到流程
    def flow_pick(self):
        self.login()
        self.pick()


if __name__ == '__main__':
    # 此处try是为了保证flow_pick 方法里面登录等其他的方法报错，能够拦截下来，然后以供后面参考
    try:
        CrhomeDriverTest().init(phoneNum="123456", account="123456@qq.com", password="666666").flow_pick()
    except Exception as e:
        print(e)

    # 上面的语句如果用multiRunner()，可以更好的保留执行截图，在第六节将会讲selenium+multiRunner



# 最后退出驱动
driver.quit()